package kgame5.k3d.util3d {
import flash.display.DisplayObject;
import flash.events.Event;

/**
 * @author kangkai
 * 这个是控制一个DisplayObject抖动的东西
 */
public class Shaker {
	
	private var target:DisplayObject;
	private var initY:int;
	
	private static var instance:Shaker;
	public static function getInstance():Shaker{
		if(instance==null){
			instance=new Shaker();
		}
		return instance;
	}
	
	public function setTarger(target:DisplayObject):void{
		this.target=target;
	}
	////////////////////////////////////////////////
	//知道为什么放再这里而不是在camera里否？
		//因为放在camera里震动意味着需要重绘屏幕，而在这里只是简单的移动world.mc的y位置！！
	//震动的特效
	private var 
		bShake:Boolean=false,//是否使用震动
		shakeA:int=0,//振幅
		shakeDur:int=0;//时间
	public function start(p_A:int,times:int):void{
		if(bShake){//必须保证震完一次才能开始新的震动，否则摄像机会震歪!
			clear();
		}

		shakeA=p_A;//A的振幅
		shakeDur=Math.floor(times/2)*2;//A的持续时间,必须是整数
		bShake=true;
		
		initY=target.y;
		
		this.target.addEventListener(Event.ENTER_FRAME, run);
	}
	
	public function clear():void{
		this.target.removeEventListener(Event.ENTER_FRAME, run);
		shakeA=0;
		bShake=false;
		target.y=initY;//放回原来位置
	}

	//每真都执行
	private function run(e:Event):void{
		
		if(shakeDur>0){
			shakeDur--;
			shakeA=-shakeA;
			target.y+=shakeA;
		}else{
			clear();
		}
	}
}//end of class
}
